/**
 * 
 */
package studystat;

import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;


/**
 * @author r0257835
 *
 */
public class Student {

	/**
	 * Velden
	 */
	// Achternaam
	private String achternaam;
	// Voornaam
	private String voornaam;
	// ISP van de student = lijst van vakken die student opneemt
	private List<Vak> vakken;
	// Lijst van alle activiteiten van de student
	private List<Activiteit> activiteiten;
	// google-account van de student
	private String googleAccount;
	// Achievements die reeds behaald zijn door de student
	private List<Achievement> achievements;
	private int oefeningenGemaakt;
	private int paginasGestudeerd;
	

	
	
	 
	/**
	 * Genereer een nieuwe student
	 * @param achternaam	achternaam van de student
	 * @param voornaam		voornaam van de student
	 * @param googleAccount	username van het googleaccount
	 */
	public Student(String achternaam, String voornaam, String googleAccount) {
		this.achternaam = achternaam;
		this.voornaam = voornaam;
		this.googleAccount = googleAccount;
		activiteiten = new ArrayList<Activiteit>();
		achievements = new ArrayList<Achievement>();
		oefeningenGemaakt=0;
		paginasGestudeerd=0;
	}
	
	
	/**
	 * Get-methodes
	 */
	
	/**
	 * @return De achternaam van de student
	 */
	public String getAchternaam() {
		return achternaam;
	}
	
	/**
	 * @return De voornaam van de student
	 */
	public String getVoornaam() {
		return voornaam;
	}
	
	/**
	 * @return De ISP van de student
	 */
	public List<Vak> getVakken() {		 // per student
		List<String> vakkenString = new ArrayList<String>();
		Query q = new Query("Student");
		q.addFilter("GoogleAccount", Query.FilterOperator.EQUAL, googleAccount );
		PreparedQuery pq = StudentManager.getInstance().getDataStore().prepare(q);
		int teller = 0;
		for (Entity result : pq.asIterable()) {
			int r=0;
			while(r==0){
		//assert( result != null );
		//for (Entity result : pq.asIterable()) {
			int k = 0;
			int i=0;
			while(k!=1){
				if(result.getProperty("Vak"+i) == null){
					k=1;
				}
				else{
					String vak = (String) result.getProperty("Vak"+i);
					vakkenString.add(vak);
				}
			  i++;
			}
			r++;
			}
			teller++;
		} 
			//}		

		List<Vak> vakken = new ArrayList<Vak>();
		for (int j=0; j<vakkenString.size();j++) {
			vakken.add(VakManager.getInstance().getVak(vakkenString.get(j)));
		}
		return vakken;
	}
	
	
	/**
	 * @return Een lijst van alle activiteiten van de student
	 */
	public List<Activiteit> getActiviteiten() {
		return activiteiten;
	}
	
	/**
	 * Deze methode haalt alle studiemomenten uit de lijst van activiteiten
	 * 
	 * @return lijst met alle studiemomenten
	 */
	
	public List<Studie> getStudies()  {
		List<Studie> studies = new ArrayList<Studie>();
		for(int i =0 ; i <activiteiten.size();i++){
		if(activiteiten.get(i) instanceof Studie) {
			Studie activiteit = (Studie) activiteiten.get(i);
			studies.add(activiteit);
			}
		}
		return studies;
	}
	
	
	/**
	 * @return De username van de student zijn google-account
	 */
	public String getGoogleAccount() {
		return googleAccount;
	}
	
	/**
	 * @return Een lijst van alle achievements die reeds door de student zijn behaald
	 */
	public List<Achievement> getAchievements() {
		System.out.println("Aantal achievements van student: "+achievements.size());
		return achievements;
	}
	
	
	
	/**
	 * Set-methodes
	 */
	
	/**
	 * Verander de achternaam van de student
	 * @param achternaam	De nieuwe achternaam van de student
	 */
	public void setAchternaam(String achternaam) {
		this.achternaam = achternaam;
	}
	
	/**
	 * Verander de voornaam van de student
	 * @param voornaam	De nieuwe voornaam van de student
	 */
	public void setVoornaam(String voornaam) {
		this.voornaam = voornaam;
	}
	
	/**
	 * Verander het ISP van de student
	 * @param vakken Het nieuwe ISP van de student
	 */
	public void setVakken(List<Vak> vakken) {
		this.vakken = vakken;
	}
	
	/**
	 * Verander de volledige lijst van activiteiten van de student
	 * @param activiteiten	De nieuwe lijst van activiteiten voor de student
	 */
	public void setActiviteiten(List<Activiteit> activiteiten) {
		this.activiteiten = activiteiten;
	}
	
	/**
	 * Verander het google-account van de gebruiker
	 * @param googleAccount	De username van het nieuwe google-account
	 */
	public void setGoogleAccount(String googleAccount) {
		this.googleAccount = googleAccount;
	}
	
	/**
	 * Verander de volledige lijst van achievements die behaald werden door de gebruiker
	 * @param achievements	De nieuwe lijst van achievements voor de student
	 */
	public void setAchievements(List<Achievement> achievements) {
		this.achievements = achievements;
		//TODO in datatstore (AchievementManager.controleerAchievements())
	}
	
	
	
	/**
	 * Add-methodes
	 */
	
	
	/**
	 * Voeg een activiteit toe bij de gebruiker
	 * @param activiteit	De activiteit die wordt toegevoegd
	 */
	public void addActiviteit(Activiteit activiteit) {
		activiteiten.add(activiteit);
		System.out.println("Toevoegen activiteit voltooid!!, grootte actilijst: "+activiteiten.size());
	}
	
	/**
	 * Voeg een nieuwe achievement toe die door de gebruiker werd behaald
	 * @param achievement	De achievement die door de gebruiker werd behaald
	 */
	public void addAchievement(Achievement achievement) {
		achievements.add(achievement);
		System.out.println("Toevoegen achievement voltooid!!, grootte achievements: "+achievements.size());
	}
	
	/**
	 * Voeg een lijst van achievements toe die door de gebruiker werden verdiend
	 * @param achievements	De lijst van achievements die door de gebruiker werden behaald
	 */
	public void addAchievements(List<Achievement> achievements) {
		achievements.addAll(achievements);
	}
	
	/**
	 * Voor de handigheid bestaat er een setmethode die het aantal ineens aanpast
	 * en een addmethode om gewoon oefeningen toe te voegen.
	 * @param aantalOefeningen het totaal aantal gemaakte oefeningen
	 */
	public void setOefeningenGemaakt(int aantalOefeningen) {
		this.oefeningenGemaakt = aantalOefeningen;
	}
	
	/**
	 * Voor de handigheid bestaat er een setmethode die het aantal ineens aanpast
	 * en een addmethode om gewoon pagina's toe te voegen.
	 * @param aantalPaginas het totaal aantal gestudeerde pagina's
	 */
	public void setPaginasGestudeerd(int aantalPaginas) {
		this.paginasGestudeerd = aantalPaginas;
	}
	/**
	 * Voor de handigheid bestaat er een setmethode die het aantal ineens aanpast
	 * en een addmethode om gewoon pagina's toe te voegen.
	 * @param aantalPaginas het aantal gestudeerde pagina's sinds de vorige update
	 */
	public void addPaginasGestudeerd(int aantalPaginas) {
		this.paginasGestudeerd += aantalPaginas;
	}
	public int getPaginasGestudeerd() {
		return paginasGestudeerd;
	}
	
	public int getOefeningenGemaakt() {
		return oefeningenGemaakt;
	}
	
	public Activiteit getActiviteit (int i) {
		return getActiviteiten().get(i);
	}
	
	public Activiteit getNietGestopteActiviteit(){
		Activiteit activiteit = null;
		System.out.println("Grootte lijst activiteiten student "+activiteiten.size());
		for(int i=0; i<activiteiten.size();i++){
			if(!activiteiten.get(i).getGestopt()){
				activiteit = activiteiten.get(i);
			}
		}
		return activiteit;
	}
}
